package fr.u.psud.polytech.controller;

import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import fr.u.psud.polytech.database.Entrepot;
import fr.u.psud.polytech.database.HibernateUtil;
import fr.u.psud.polytech.database.Produit;
import fr.u.psud.polytech.database.StockProduit;



public class ProduitManager {
	public ProduitManager() {
		super();
	}

	 public Produit getProduit(Integer id) {
         Produit p = null;

         Transaction trns = null;
         Session session = HibernateUtil.getSessionFactory().openSession();
         try {
                 trns = session.beginTransaction();
                 p = (Produit) session.get(Produit.class, id);
                 session.getTransaction().commit();
         } catch (RuntimeException ex) {
                 if (trns != null) {
                         trns.rollback();
                 }
                 ex.printStackTrace();
         } finally {
                 session.flush();
                 session.close();
         }

         return p;
 }

	
	public void addProduit(String nom, String description, Integer taille,Integer prix, Integer poids) {
		Transaction trns = null;
		// ouverture de la session
		Session session = HibernateUtil.getSessionFactory().openSession();
		try {
			// début de la transaction
			trns = session.beginTransaction();
			// création de l'Produit
			
			Produit p = new Produit();
			p.setNom(nom);
			p.setDescription(description);
			p.setTaille(taille);
			p.setPrix(prix);
			p.setPoids(poids);
//
			session.save(p);
			session.getTransaction().commit();
		}
		// gestion des exceptions s'il y'en a
		catch (Exception e) {
			if (trns != null) {
				trns.rollback();
			}
			e.printStackTrace();
		} finally {
			session.flush();
			session.close();
		}
	}
	
	
	public void  addProduitToEntrepot(Integer quantite, Entrepot entrepot, Produit produit){
		Transaction trns = null;
		boolean found =false;
		Session session = HibernateUtil.getSessionFactory().openSession();
		try {
			StockProduit sp = null;
			Set<StockProduit> stockList = entrepot.getStockEntrepot();
						
			Iterator<StockProduit> it = stockList.iterator();
			
			while(it.hasNext() && ! found){
				sp = it.next();
				if(sp.getProduit().getId()==produit.getId() && sp.getEntrepot().getId() == entrepot.getId()){
					found=true;
				}
			}
			
			trns = session.beginTransaction();
			
			if(found){
				sp.setQuantite(sp.getQuantite()+quantite);
				session.update(sp);
			}
			else{
				sp = new StockProduit();
				sp.setEntrepot(entrepot);
				sp.setProduit(produit);
				sp.setQuantite(quantite);
				session.save(sp);
			}
			
			
			
			session.getTransaction().commit()	;
		} catch (RuntimeException ex) {
			if (trns != null) {
				trns.rollback();
			}
			ex.printStackTrace();
		} finally {
			session.flush();
			session.close();
		}
	}
	
	public void deleteProduit(Integer id) {
		Transaction trns = null;
		
		// ouverture de la session
		Session session = HibernateUtil.getSessionFactory().openSession();
		try {
			// création de l'Produit
			Produit p = getProduit(id);
			
			Set<StockProduit> stockList = p.getDispatchEntrepot();
			
			Iterator<StockProduit> it = stockList.iterator();
			
			while(it.hasNext()){
				StockProduit sp = it.next();
				if(sp.getQuantite()>0){
					throw new Exception("Il reste du stock de ce produit dans l'entrepot "+sp.getEntrepot().getNom());
				}
			}
			
			// début de la transaction
			trns = session.beginTransaction();

			session.delete(p);
			session.getTransaction().commit();
		}
		// gestion des exceptions s'il y'en a
		catch (Exception e) {
			if (trns != null) {
				trns.rollback();
			}
			e.printStackTrace();
		} finally {
			session.flush();
			session.close();
		}
	}

	public void addEntrepot(Produit p, Entrepot e) {
		Set<StockProduit> dispatch = p.getDispatchEntrepot();
	}

	public List<Produit> getProduit(){
		List<Produit> produitList= null;

		Transaction trns = null;
		Session session = HibernateUtil.getSessionFactory().openSession();
		try {
			session.beginTransaction();
			Query query = session.createQuery("from Produit");

			produitList= query.list();
			session.getTransaction().commit();
		} catch (RuntimeException ex) {
			if (trns != null) {
				trns.rollback();
			}
			ex.printStackTrace();
		} finally {
			session.flush();
			session.close();
		}

		return produitList;
	}
	
	public static void main(String args[]) {
		ProduitManager ent = new ProduitManager();
		ent.addProduit("test","produit de test",100,1000,100000);

	}
}
